package models

import "gin-swagger-demo/pkg/logging"

type User struct {
	Id              int    `gorm:"not null pk autoincr INT(11)"`
	Openid          string `gorm:"not null default '' comment('微信openid') VARCHAR(32)"`
	OpenidXchx      string `gorm:"not null default '' comment('小程序openid') index VARCHAR(32)"`
	Unionid         string `gorm:"not null default '' comment('微信unionId') VARCHAR(32)"`
	SessionKey      string `gorm:"not null default '' comment('session_key') VARCHAR(32)"`
	Subscribe       int    `gorm:"not null default 0 comment('是否关注：0=否，1=是') TINYINT(1)"`
	Nickname        string `gorm:"not null default '' comment('微信昵称') VARCHAR(50)"`
	Sex             int    `gorm:"not null default 0 comment('用户的性别，1=男性，2=女性，0=未知') TINYINT(1)"`
	City            string `gorm:"not null default '' comment('用户所在城市') VARCHAR(20)"`
	Country         string `gorm:"not null default '' comment('用户所在国家') VARCHAR(20)"`
	Province        string `gorm:"not null default '' comment('用户所在省份') VARCHAR(20)"`
	Language        string `gorm:"not null default '' comment('用户的语言，简体中文为zh_CN') VARCHAR(20)"`
	Headimgurl      string `gorm:"not null default '' comment('微信头像') VARCHAR(256)"`
	PhoneNumber     string `gorm:"not null default '' comment('手机号，带区号') VARCHAR(16)"`
	PurePhoneNumber string `gorm:"not null default '' comment('手机号，没区号') VARCHAR(16)"`
	CountryCode     string `gorm:"not null default '' comment('国家码') VARCHAR(8)"`
	SubscribeTime   int    `gorm:"not null default 0 comment('用户关注时间,如果用户曾多次关注，则取最后关注时间') INT(10)"`
	SubscribeScene  string `gorm:"not null default '' comment('返回用户关注的渠道来源') VARCHAR(64)"`
	Email           string `gorm:"not null default '' comment('邮箱') VARCHAR(50)"`
	IsBanned        int    `gorm:"not null default 0 comment('是否被禁用') TINYINT(1)"`
	CreateTime      int    `gorm:"created not null default 0 comment('创建时int间') INT(10)"`
	UpdateTime      int    `gorm:"updated not null default 0 comment('最后更新时间') INT(10)"`
}

func (item *User) Add() (int, error) {
	res := db.Create(item)
	if res.Error != nil {
		logging.Error("DB: User.Add: ", "msg", res.Error.Error(), "item", item)
	}
	return item.Id, res.Error
}

func (item *User) Edit(data interface{}) (int64, error) {
	res := db.Model(item).Updates(data)

	if res.Error != nil {
		logging.Error("DB: AdminAccount.Edit: ", "msg", res.Error.Error(), "item", item, "data", item)
	}
	return res.RowsAffected, res.Error
}

func (item *User) Del() (int64, error) {
	res := db.Where(item).Delete(item)
	if res.Error != nil {
		logging.Error("DB: AdminAccount.Delete: ", "msg", res.Error.Error(), "item", item)
	}
	return res.RowsAffected, res.Error
}

func (item *User) Get() (bool, error) {
	res := db.Where(item).First(&item)
	if res.Error != nil {
		logging.Error("DB: AdminAccount.Get: ", "msg", res.Error.Error(), "item", item)
		return false, res.Error
	}
	return true, nil
}

func GetUserById(id int) (*User, error) {
	account := &User{}
	result := db.Model(&User{}).Where("id = ? ", id).First(account)
	return account, result.Error
}

func (item *User) GetUserById(id int) (bool, error) {
	res := db.Where("id=?", id).First(&item)
	if res.Error != nil {
		logging.Error("DB: User.GetUserById: ", "msg", res.Error.Error(), "id", id)
		return false, res.Error
	}
	return true, nil
}
